Projekt Pronal Projekt Pronal

Kazalo:
Sofinasiranje projekta
Starejši - učbenik...
Tekmovanja...
Tekmovanja - dopolni...
Tekmovanja - Parsons...
Tekmovanja - popravi...
Starejši - zbirka nalog
Funkcije
If stavek
Izpisi
Množice
Nizi
Pisanje in popravljanje programa
Seznami in nizi
Slovarji
Spoznajmo Python
Uvod v funkcije
Zanka for
Zanka while
If stavek

If stavek


Indeks telesne mase

1. podnaloga

ITM oz. indeks telesne mase je številka, s katero lahko v grobem ocenimo stanje prehranjenosti pri odraslih ljudeh. Če je $m$ masa človeka v kilogramih in $h$ njegova višina v metrih, izračunamo ITM po naslednji formuli: $ITM = \frac{m}{h^2}$.

Težo, ki je podana v kilogramih, imamo zapisano v spremenljivki masa. Višino, ki je podana v centimetrih, pa imamo zapisano v spremenljivki visina. Sestavite program, ki prebere težo in višino, izračuna ITM in vam pove, v kateri razred prehranjenosti spadate. Izračunani ITM izpišite na dve decimalni mesti natančno, uporabite funkcijo dve_decimalki(x).

def dve_decimalki(x):
    """Funkcija vrne niz, ki vsebuje zapis decimalnega števila x
    na dve decimalni mesti natančno."""
    return '{0:.2f}'.format(x)

Izpis naj bo sledeč:

  • $ITM < 18.5$: podhranjenost
  • $18.5 \leq ITM < 25$: normalna prehranjenost
  • $25 \leq ITM < 30$: prekomerna prehranjenost
  • $30 \leq ITM$: debelost

Primer: za podatke masa = 82.5, visina = 185.3 naj program izpiše:

Vnesite težo: 82.5
Vnesite višino: 185.3
Vaš ITM: 24.03
normalna prehranjenost

Uradna rešitev

def dve_decimalki(x):
     """Funkcija vrne niz, ki vsebuje zapis decimalnega števila x na dve
     decimalni mesti natančno."""
     return '{0:.2f}'.format(x)

masa = float(input('Vnesite težo: '))
visina = float(input('Vnesite višino: '))

itm = masa / (visina / 100)**2
print('Vaš ITM:', dve_decimalki(itm))
if itm < 18.5:
    print('podhranjenost')
elif itm < 25:
    print('normalna prehranjenost')
elif itm < 30:
    print('prekomerna prehranjenost')
else:
    print('debelost')

Ednina, dvojina, množina

1. podnaloga

Napišite funkcijo fin_stanje(n), ki kot argument sprejme količino denarja na bančnem računu podano v evrih (celih) in slovničnemu številu ustrezno vrne opis finančnega stanja.

 >>> fin_stanje(1)
 Stanje: 1 evro
 >>> fin_stanje(1002)
 Stanje: 1002 evra
 >>> fin_stanje(-203)
 Stanje: -203 evri
 >>> fin_stanje(215)
 Stanje: 215 evrov

Primer, če je vneseno stanje večje ali enako $1000000$ evrov:

 >>>fin_stanje(1000002)
 Bogataš!

Primer, če je vneseno stanje nižje od -300 evrov:

 >>>fin_stanje(-302)
 Začnite varčevati!

Uradna rešitev

def fin_stanje(n):
    """Vrne opis finančnega stanja."""
    if n < -300:
        return 'Začnite varčevati!'
    if n >= 1000000:
        return 'Bogataš!'
    if abs(n) % 100 == 1:
        return 'Stanje: ' + str(n) +' evro'
    if abs(n) % 100 == 2:
        return 'Stanje: ' + str(n) + ' evra'
    if abs(n) % 100 == 3 or abs(n) % 100 == 4:
        return 'Stanje: ' + str(n) + ' evri'
    return 'Stanje: ' + str(n) + ' evrov'

2. podnaloga

Sestavite funkcijo st_ljudi(n), ki kot argument sprejme poljubno naravno število in nato v slovnično pravilni obliki vrne opis števila ljudi v dvorani kulturnega doma (glejte zglede). Dvorana sprejme največ $500$ ljudi. Podatki so smiselni, torej celo število ljudi, teh je lahko najmanj $0$. Primer za n = 0:

 >>> st_ljudi(0)
 Dvorana je prazna.

Primer za n = 1:

 >>> st_ljudi(1)
 V dvorani je 1 človek.

Primer za n = 303:

 >>> st_ljudi(303)
 V dvorani so 303 ljudje.

Primer za n = 500:

 >>> st_ljudi(500)
 Dvorana je polna.

Primer za n = 502:

 >>> st_ljudi(502)
 Dvorana je polna. Zunaj sta ostala 2 človeka.

Uradna rešitev

def st_ljudi(n):
    """Vrne niz z opisom števila ljudi v dvorani."""
    if n == 0:
        return 'Dvorana je prazna.'
    if n < 500:
        if n % 100 == 1:
            return 'V dvorani je ' + str(n) + ' človek.'
        elif n % 100 == 2:
            return 'V dvorani sta ' + str(n) + ' človeka.'
        elif n % 100 == 3 or n % 100 == 4:
            return 'V dvorani so ' + str(n) + ' ljudje.'
        else:
            return 'V dvorani je ' + str(n) + ' ljudi.'
    if n == 500:
        return 'Dvorana je polna.'
    # več kot 500
    if n % 100 == 1:
        return 'Dvorana je polna. Zunaj je ostal ' + str(n - 500)+' človek.'
    elif n % 100 == 2:
        return 'Dvorana je polna. Zunaj sta ostala ' + str(n - 500)+' človeka.'
    elif n % 100 == 3 or n % 100 == 4:
        return 'Dvorana je polna. Zunaj so ostali ' + str(n - 500)+' ljudje.'
    else:
        return 'Dvorana je polna. Zunaj je ostalo ' + str(n - 500)+' ljudi.'

3. podnaloga

Sestavite program, ki prebere naravno število n in nato izpiše niz oblike

Koliko limon imate? 103
Imate 103 limone.

Koliko limon imate? 0
Imate 0 limon.

pri čemer mora biti seveda vse pravilno sklanjano.

Uradna rešitev

n = int(input('Koliko limon imate? '))
ostanek = n % 100
if ostanek == 1:
    koncnica = 'o'
elif ostanek == 2:
    koncnica = 'i'
elif ostanek == 3 or ostanek == 4:
    koncnica = 'e'
else:
    koncnica = ''
print("Imate {0} limon{1}.".format(n, koncnica))

Dolžinske enote

1. podnaloga

Sestavite funkcijo milimetri(kolicina, enota), ki razdaljo, podano z argumentoma kolicina in enota, pretvori v milimetre. Pri tem je kolicina neko število, enota pa je eden od nizov 'm', 'dm', 'cm' ali 'mm', ki predstavlja enoto za dolžino. Primer:

>>> milimetri(3, 'm')
3000
>>> milimetri(15, 'cm')
150

Uradna rešitev

def milimetri(kolicina, enota):
    """Količino v dani enoti pretvori v milimetre."""
    if enota == 'm':
        odg = 1000 * kolicina
    elif enota == 'dm':
        odg = 100 * kolicina
    elif enota == 'cm':
        odg = 10 * kolicina
    else:
        odg = kolicina
    return odg

2. podnaloga

Sestavite funkcijo milimetriV2(kolicina, enota), ki razdaljo, podano z argumentoma kolicina in enota, pretvori v milimetre. Pri tem je kolicina neko število, enota pa je zagotovo eden od nizov 'm', 'dm', 'cm' ali 'mm', ki predstavlja enoto. Primer:

>>> milimetri(3, 'm')
3000
>>> milimetri(15, 'cm')
150

Pri tem ne smeš uporabiti niti gnezdenih stavkov if niti else. Namig: v funkciji imamo lahko več ukazov return.

Uradna rešitev

def milimetriV2(kolicina, enota):
    """Količino v dani enoti pretvori v milimetre."""
    if enota == 'm':
        return 1000 * kolicina
    # če smo prišli sem, enota zagotovo niso metri
    if enota == 'dm':
        return 100 * kolicina
    if enota == 'cm':
        return 10 * kolicina
    # torej gre za mm
    return kolicina

3. podnaloga

Sestavite funkcijo primerjaj(mera1, enota1, mera2, enota2), ki za dve dolžini pove, katera je večja. Prva dolžina je podana v spremenljivkah mera1 in enota1, druga pa v spremenljivkah mera2 in enota2.

Funkcija naj vrne 'prva', če je prva dolžina večja od druge, 'enaki', če sta dolžini enaki, in 'druga', če je druga dolžina večja od prve. Primer:

>>> primerjaj(2, 'm', 3, 'm')
druga
>>> primerjaj(1, 'm', 100, 'cm')
enaki

Namig: uporabite funkcijo, ki ste jo že napisali.

Uradna rešitev

def primerjaj(mera1, enota1, mera2, enota2):
    """Vrne, katera dolžina je večja."""
    # pretvorimo obe razdalji v mm
    razlika = milimetri(mera1, enota1) - milimetri(mera2, enota2)
    if razlika > 0:
        return 'prva'
    if razlika < 0:
        return 'druga'
    # ni se izvedel noben izmed gornjih ukazov return, torej ni bil izpolnjen noben pogoj
    return 'enaki'

4. podnaloga

Sestavite funkcijo primerjaj_enoti(enota1, enota2), ki za dve dolžinski enoti pove, katera je večja. Funkcija naj vrne 1, če je prva enota večja od druge, 0, če sta enoti enaki, in -1, če je druga enota večja od prve. Primer:

>>> primerjaj_enoti('dm', 'cm')
1
>>> primerjaj_enoti('mm', 'm')
-1

Namig: neposredno primerjanje nizov bo dalo napačen rezultat!

Uradna rešitev

def primerjaj_enoti(enota1, enota2):
    """Vrne 1, če je večja enota1,
       vrne 0, če sta enoti enaki,
       vrne -1, če je večja enota2."""
    primerjava = primerjaj(1, enota1, 1, enota2)   # uporabimo funkcijo prejšnje naloge
    if primerjava == 'prva':
        return 1
    if primerjava == 'druga':
        return -1
    return 0

Indiana Jones

1. podnaloga

Indiana Jones najde v starem templju tri zlate kipce, ker pa ima samo dve roki, mora enega pustiti tam. Pustil bo tistega z najnižjo vrednostjo. Sestavite funkcijo indiana(stevilo1, stevilo2, stevilo3), ki kot argumente sprejme vrednosti kipcev ter vrne podatek (niz), katera dva kipca se najbolj splača vzeti s sabo.

Možne rešitve so:

  • če so vrednosti kipcev različne ali če se dve vrednosti ponovita in sta večji od tretje:

    "Vzeti mora kipca 2 in 3." "Vzeti mora kipca 1 in 3." "Vzeti mora kipca 1 in 2."

  • če so vrednosti vseh kipcev enake:

    "Vzame lahko katerakoli dva kipca."

  • če se dve vrednosti ponovita in sta manjši od tretje:

    "Vzeti mora kipec 3 ter enega od preostalih dveh." "Vzeti mora kipec 2 ter enega od preostalih dveh." "Vzeti mora kipec 1 ter enega od preostalih dveh."

Uradna rešitev

def indiana(stevilo1, stevilo2, stevilo3):
    """Vrne niz, katera kipca se splača vzeti."""

    # če so vrednosti vseh kipcev enake, vzamemo poljubna kipca
    if stevilo1 == stevilo2 == stevilo3:
        return "Vzame lahko katerakoli dva kipca."

    # če je vrednost prvega kipca manjša od ostalih, izločimo prvi kipec
    # podobno naprej
    if stevilo1 < min(stevilo2, stevilo3):
        return "Vzeti mora kipca 2 in 3."
    if stevilo2 < min(stevilo1, stevilo3):
        return "Vzeti mora kipca 1 in 3."
    if stevilo3 < min(stevilo1, stevilo2):
        return "Vzeti mora kipca 1 in 2."

    # če se dve vrednosti ponovita, potem ločimo primer, ko je tretja vrednost ali večja ali manjša od prvih dveh
    # če je manjša, vzamemo kipca s prvima dvema vrednostma
    # če je večja, vzamemo kipec s tretjo vrednostjo in izbiramo med ostalima kipcema
    if (stevilo1 == stevilo2) and (stevilo3 != stevilo2):
        if stevilo1 < stevilo3:
            return "Vzeti mora kipec 3 ter enega od preostalih dveh."
        else:
            return "Vzeti mora kipca 1 in 2."
    if (stevilo1 == stevilo3) and (stevilo3 != stevilo2):
        if stevilo1 < stevilo2:
            return "Vzeti mora kipec 2 ter enega od preostalih dveh."
        else:
            return "Vzeti mora kipca 1 in 3."
    if (stevilo2 == stevilo3) and (stevilo1 != stevilo2):
        if stevilo2 < stevilo1:
            return "Vzeti mora kipec 1 ter enega od preostalih dveh."
        else:
            return "Vzeti mora kipca 2 in 3."

2. podnaloga

Sedaj pa sestavite funkcijo izguba(stevilo1, stevilo2, stevilo3), ki kot argumente sprejme vrednosti kipcev ter vrne, kolikšna je vrednost kipca, ki ga bo Indiana Jones žal moral pustiti v templju. Primer:

>>> izguba(7, 2, 3)
2
>>> izguba(7, 8, 7)
7

Uradna rešitev

def izguba(stevilo1, stevilo2, stevilo3):
    """Vrne vrednost kipca, ki ga bo Indiana Jones moral pustiti."""
    return min(stevilo1, stevilo2, stevilo3)

3. podnaloga

Sedaj pa sestavite funkcijo kateri_vrednosti(stevilo1, stevilo2, stevilo3), ki kot argumente sprejme vrednosti kipcev ter vrne po velikosti urejen par vrednosti kipcev, ki ju bo Indiana Jones vzel. Tako:

>>> kateri_vrednosti(7, 2, 3)
(3, 7)
>>> kateri_vrednosti(7, 8, 7)
(7, 8)

Uradna rešitev

def kateri_vrednosti(stevilo1, stevilo2, stevilo3):
    """Vrne par vrednosti kipcev, ki ju bo Indiana Jones odnesel iz templja."""
    najv = max(stevilo1, stevilo2, stevilo3)
    najm = min(stevilo1, stevilo2, stevilo3)
    srednje = stevilo1 + stevilo2 + stevilo3 - najv - najm
    return srednje, najv

Bratska igra

Za nalogo potrebujete le znanje definiranja funkcij in pogojnega stavka.

1. podnaloga

Matej se rad igra s kamenčki in jih cel dan nabira naokrog. Zvečer ga neskončno zabava, ko njegov mlajši brat poskuša uganiti, koliko jih je nabral.

Če brat pove premajhno število, mu Matej odgovori 'več', če pove preveliko število, mu Matej odgovori 'manj', če pa število ugane, mu Matej odgovori 'točno'.

Sestavite funkcijo ugibaj(matej, brat), ki simulira en korak zgornje igre. Funkcija naj Matejev odgovor vrne kot niz.

Primer:

>>> ugibaj(8, 5)
'več'

Uradna rešitev

def ugibaj(matej, brat):
  """Vrne Matejev odgovor."""
  if matej > brat:
    return 'več'
  elif matej < brat:
    return 'manj'
  else:
    return 'točno'

2. podnaloga

Da bi igro popestril, je Matej razdelil kamenčke v obe roki, brat pa mora uganiti število kamenčkov v vsaki roki posebej. Ob vsakem poskusu Matej izračuna absolutno razliko med pravim številom kamenčkov v posamezni roki in bratovim poskusom za število kamenčkov v roki. Nato bratu pove manjše izmed teh dveh števil.

Sestavite funkcijo ugibaj1(matej_leva, matej_desna, brat_leva, brat_desna), ki sprejme štiri nenegativna cela števila in kot število vrne Matejev odgovor. Če brat ugane obe števili, naj funkcija vrne -100. Primer:

>>> ugibaj1(8, 10, 5, 3)
5

Uradna rešitev

def ugibaj1(matej_leva, matej_desna, brat_leva, brat_desna):
  """Vrne vrednost največje razlike."""
  razlika1 = abs(matej_leva - brat_leva)
  razlika2 = abs(matej_desna - brat_desna)
  if max(razlika1, razlika2) == 0:   # uganjeni sta obe
    return -100
  return min(razlika1, razlika2)

3. podnaloga

Zgornja igra ni bila preveč všeč Matejevemu bratu, saj je običajno trajala predolgo in je zato brat še pred koncem igre zaspal. Zato je od Mateja zahteval, da mu za vsako roko pove še, ali je število kamenčkov v njej večje, manjše oz. enako ugibu. Mateju pa se je to zdelo preveč, zato sta se odločila za kompromis: Matej bo bratu povedal le, ali je brat obakrat povedal preveliko število, obakrat premajhno ali pa enkrat premajhno in drugič preveliko. Ustrezni Matejevi odgovori so 'Obakrat preveč.', 'Obakrat premalo.' in 'Preveč in premalo.'. Če brat ugane eno izmed števil, drugega pa ne, se Matej pretvarja, kot da je brat namesto pravega števila povedal preveliko število.

Sestavite funkcijo ugibaj2(matej_leva, matej_desna, brat_leva, brat_desna), ki sprejme štiri nenegativna cela števila in Matejev odgovor vrne kot niz. Če brat ugane obe števili, naj funkcija vrne niz 'Bravo!'

Primer:

>>> ugibaj2(4, 3, 4, 6)
'Obakrat preveč.'

Uradna rešitev

def ugibaj2(matej_leva, matej_desna, brat_leva, brat_desna):
  """Vrne Matejev odgovor."""
  razlika_leva = brat_leva - matej_leva
  razlika_desna = brat_desna - matej_desna

  if razlika_leva == 0 and razlika_desna == 0:
    return 'Bravo!'
  elif razlika_leva >= 0 and razlika_desna >= 0:
    return 'Obakrat preveč.'
  elif razlika_leva < 0 and razlika_desna < 0:
    return 'Obakrat premalo.'
  else:
    return 'Preveč in premalo.'

Čas za spanje

1. podnaloga

Marjetka je ravnokar postala mamica. Ker še nima izkušenj, ne ve, koliko mora njen otrok spati. Otrok mora po izročilu tete Pehte spati med 20. in 8. uro ter med 12. in 16. uro. Napišite funkcijo spanje(čas), ki kot argument sprejme zaokroženo uro (npr. 14) ter vrne niz 'spi', če mora dojenček spati, ali niz 'bedi', če mu ni treba spati.

>>> spanje(16)
'bedi'
>>> spanje(12)
'spi'

Uradna rešitev

def spanje(cas):
    """Vrne niz 'spi' če mora otrok spati, sicer vrne 'bedi'."""
    if (cas <= 8) or (cas >= 20) or (12 <= cas <= 16):
        return 'spi'
    else:
        return 'bedi'

2. podnaloga

Marjetke ne zanima samo, ali bi moral ob uri spati ali bedeti, ampak tudi katere ure v dnevu bi moral spati. Napišite še funkcijo ure(spanje), ki kot argument sprejme niz 'spi' ali niz 'bedi' ter vrne intervale, v katerih naj bi dojenček spal ali bedel.

>>> ure('spi')
'med 12. in 16. ter 20. in 8.'
>>> ure(bedi)
'med 8. in 12. ter 16. in 20.'

Uradna rešitev

def ure(spanje):
    """Glede na aktivnost vrne niz s časovnima intervaloma."""
    if spanje == 'spi':
        return 'med 12. in 16. ter 20. in 8.'
    else:
        return 'med 8. in 12. ter 16. in 20.'
Mesto objave ob koncu projekta 15.9.2018